<?php

/*
	Question2Answer (c) Gideon Greenspan

	http://www.question2answer.org/

	
	File: qa-include/qa-page-admin-widgets.php
	Version: See define()s at top of qa-include/qa-base.php
	Description: Controller for admin page for editing widgets


	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.
	
	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	More about this license: http://www.question2answer.org/license.php
*/

if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser
    header('Location: ../');
    exit;
}

require_once QA_INCLUDE_DIR . 'qa-app-admin.php';
require_once QA_INCLUDE_DIR . 'qa-db-selects.php';


//	Get current list of widgets and determine the state of this admin page

$widgetid = qa_post_text('edit');
if (!strlen($widgetid))
    $widgetid = qa_get('edit');

list($widgets, $pages) = qa_db_select_with_pending(
    qa_db_widgets_selectspec(),
    qa_db_pages_selectspec()
);

if (isset($widgetid)) {
    $editwidget = null;
    foreach ($widgets as $widget)
        if ($widget['widgetid'] == $widgetid)
            $editwidget = $widget;

} else {
    $editwidget = array('title' => qa_post_text('title'));
    if (!isset($editwidget['title']))
        $editwidget['title'] = qa_get('title');
}

$module = qa_load_module('widget', @$editwidget['title']);

$widgetfound = isset($module);


//	Check admin privileges (do late to allow one DB query)

if (!qa_admin_check_privileges($qa_content))
    return $qa_content;


//	Define an array of relevant templates we can use

$templatelangkeys = array(
    'question' => 'admin/question_pages',

    'qa' => 'main/recent_qs_as_title',
    'activity' => 'main/recent_activity_title',
    'questions' => 'admin/question_lists',
    'hot' => 'main/hot_qs_title',
    'unanswered' => 'main/unanswered_qs_title',

    'tags' => 'main/popular_tags',
    'categories' => 'misc/browse_categories',
    'users' => 'main/highest_users',
    'ask' => 'question/ask_title',

    'tag' => 'admin/tag_pages',
    'user' => 'admin/user_pages',
    'message' => 'misc/private_message_title',

    'search' => 'main/search_title',
    'feedback' => 'misc/feedback_title',

    'login' => 'users/login_title',
    'register' => 'users/register_title',
    'account' => 'profile/my_account_title',
    'favorites' => 'misc/my_favorites_title',
    'updates' => 'misc/recent_updates_title',

    'ip' => 'admin/ip_address_pages',
    'admin' => 'admin/admin_title',
);

$templateoptions = array();

if (isset($module) && method_exists($module, 'allow_template')) {
    foreach ($templatelangkeys as $template => $langkey)
        if ($module->allow_template($template))
            $templateoptions[$template] = qa_lang_html($langkey);

    if ($module->allow_template('custom'))
        foreach ($pages as $page)
            if (!($page['flags'] & QA_PAGE_FLAGS_EXTERNAL))
                $templateoptions['custom-' . $page['pageid']] = qa_html($page['title']);
}


//	Process saving an old or new widget

$securityexpired = false;

if (qa_clicked('docancel'))
    qa_redirect('admin/layout');

elseif (qa_clicked('dosavewidget')) {
    require_once QA_INCLUDE_DIR . 'qa-db-admin.php';

    if (!qa_check_form_security_code('admin/widgets', qa_post_text('code')))
        $securityexpired = true;

    else {
        if (qa_post_text('dodelete')) {
            qa_db_widget_delete($editwidget['widgetid']);
            qa_redirect('admin/layout');

        } else {
            if ($widgetfound) {
                $intitle = qa_post_text('title');
                $inposition = qa_post_text('position');
                $intemplates = array();

                if (qa_post_text('template_all'))
                    $intemplates[] = 'all';

                foreach (array_keys($templateoptions) as $template)
                    if (qa_post_text('template_' . $template))
                        $intemplates[] = $template;

                $intags = implode(',', $intemplates);

                //	Perform appropriate database action

                if (isset($editwidget['widgetid'])) { // changing existing widget
                    $widgetid = $editwidget['widgetid'];
                    qa_db_widget_set_fields($widgetid, $intags);

                } else
                    $widgetid = qa_db_widget_create($intitle, $intags);

                qa_db_widget_move($widgetid, substr($inposition, 0, 2), substr($inposition, 2));
            }

            qa_redirect('admin/layout');
        }
    }
}


//	Prepare content for theme

$qa_content = qa_content_prepare();

$qa_content['title'] = qa_lang_html('admin/admin_title') . ' - ' . qa_lang_html('admin/layout_title');
$qa_content['error'] = $securityexpired ? qa_lang_html('admin/form_security_expired') : qa_admin_page_error();

$positionoptions = array();

$placeoptionhtml = qa_admin_place_options();

$regioncodes = array(
    'F' => 'full',
    'M' => 'main',
    'S' => 'side',
);

foreach ($placeoptionhtml as $place => $optionhtml) {
    $region = $regioncodes[substr($place, 0, 1)];

    $widgetallowed = method_exists($module, 'allow_region') && $module->allow_region($region);

    if ($widgetallowed)
        foreach ($widgets as $widget)
            if (($widget['place'] == $place) && ($widget['title'] == $editwidget['title']) && ($widget['widgetid'] !== @$editwidget['widgetid']))
                $widgetallowed = false; // don't allow two instances of same widget in same place

    if ($widgetallowed) {
        $previous = null;
        $passedself = false;
        $maxposition = 0;

        foreach ($widgets as $widget)
            if ($widget['place'] == $place) {
                $positionhtml = $optionhtml;

                if (isset($previous))
                    $positionhtml .= ' - ' . qa_lang_html_sub('admin/after_x', qa_html($passedself ? $widget['title'] : $previous['title']));

                if ($widget['widgetid'] == @$editwidget['widgetid'])
                    $passedself = true;

                $maxposition = max($maxposition, $widget['position']);
                $positionoptions[$place . $widget['position']] = $positionhtml;

                $previous = $widget;
            }

        if ((!isset($editwidget['widgetid'])) || $place != @$editwidget['place']) {
            $positionhtml = $optionhtml;

            if (isset($previous))
                $positionhtml .= ' - ' . qa_lang_html_sub('admin/after_x', $previous['title']);

            $positionoptions[$place . (isset($previous) ? (1 + $maxposition) : 1)] = $positionhtml;
        }
    }
}

$positionvalue = @$positionoptions[$editwidget['place'] . $editwidget['position']];

$qa_content['form'] = array(
    'tags' => 'method="post" action="' . qa_path_html(qa_request()) . '"',

    'style' => 'tall',

    'fields' => array(
        'title' => array(
            'label' => qa_lang_html('admin/widget_name') . ' &nbsp; ' . qa_html($editwidget['title']),
            'type' => 'static',
            'tight' => true,
        ),

        'position' => array(
            'id' => 'position_display',
            'tags' => 'name="position"',
            'label' => qa_lang_html('admin/position'),
            'type' => 'select',
            'options' => $positionoptions,
            'value' => $positionvalue,
        ),

        'delete' => array(
            'tags' => 'name="dodelete" id="dodelete"',
            'label' => qa_lang_html('admin/delete_widget_position'),
            'value' => 0,
            'type' => 'checkbox',
        ),

        'all' => array(
            'id' => 'all_display',
            'label' => qa_lang_html('admin/widget_all_pages'),
            'type' => 'checkbox',
            'tags' => 'name="template_all" id="template_all"',
            'value' => is_numeric(strpos(',' . @$editwidget['tags'] . ',', ',all,')),
        ),

        'templates' => array(
            'id' => 'templates_display',
            'label' => qa_lang_html('admin/widget_pages_explanation'),
            'type' => 'custom',
            'html' => '',
        ),
    ),

    'buttons' => array(
        'save' => array(
            'label' => qa_lang_html(isset($editwidget['widgetid']) ? 'main/save_button' : ('admin/add_widget_button')),
        ),

        'cancel' => array(
            'tags' => 'name="docancel"',
            'label' => qa_lang_html('main/cancel_button'),
        ),
    ),

    'hidden' => array(
        'dosavewidget' => '1', // for IE
        'edit' => @$editwidget['widgetid'],
        'title' => @$editwidget['title'],
        'code' => qa_get_form_security_code('admin/widgets'),
    ),
);

foreach ($templateoptions as $template => $optionhtml)
    $qa_content['form']['fields']['templates']['html'] .=
        '<input type="checkbox" name="template_' . qa_html($template) . '"' .
            (is_numeric(strpos(',' . @$editwidget['tags'] . ',', ',' . $template . ',')) ? ' checked' : '') .
            '/> ' . $optionhtml . '<br/>';

if (isset($editwidget['widgetid']))
    qa_set_display_rules($qa_content, array(
        'templates_display' => '!(dodelete||template_all)',
        'all_display' => '!dodelete',
    ));

else {
    unset($qa_content['form']['fields']['delete']);
    qa_set_display_rules($qa_content, array(
        'templates_display' => '!template_all',
    ));
}

if (!$widgetfound) {
    unset($qa_content['form']['fields']['title']['tight']);
    $qa_content['form']['fields']['title']['error'] = qa_lang_html('admin/widget_not_available');
    unset($qa_content['form']['fields']['position']);
    unset($qa_content['form']['fields']['all']);
    unset($qa_content['form']['fields']['templates']);
    if (!isset($editwidget['widgetid']))
        unset($qa_content['form']['buttons']['save']);

} elseif (!count($positionoptions)) {
    unset($qa_content['form']['fields']['title']['tight']);
    $qa_content['form']['fields']['title']['error'] = qa_lang_html('admin/widget_no_positions');
    unset($qa_content['form']['fields']['position']);
    unset($qa_content['form']['fields']['all']);
    unset($qa_content['form']['fields']['templates']);
    unset($qa_content['form']['buttons']['save']);
}

$qa_content['navigation']['sub'] = qa_admin_sub_navigation();


return $qa_content;


/*
	Omit PHP closing tag to help avoid accidental output
*/